'''
Created on 2018年9月12日

@author: lijie
'''
from builtins import str
import os
import re
import socket
import time

import redis
import winrm

from utilites.database_helper import MysqlHelper


# curPath = os.path.abspath(os.path.dirname(__file__))
# rootPath = os.path.split(curPath)[0]
# sys.path.append(rootPath)
class RunManageHelper():
    RMURL='http://10.7.3.57:8080'
    
    def getFileList(self, dir_path, filelist):
        """封装一个方法，用来读取指定目录下面的子目录，并且拼接文件名.
        Args: 无
        Returns:
        Raises:
        author： roc
        createTime：2018-4-18
        example：list = getFileList(py_source, [])
        """
        if re.search(r'__.*__', dir_path) is None:                       #判断：文件名称中间是否有‘__.*__’这样的文件存在
#             newDir = dir_path                                            #将传递进来的read_dir存到一个变量newDir里面，这个变量存的是目录名字
            if os.path.isfile(dir_path):                                 #判断这个传递进来的目录是不是一个完整带路径文件名字
                filelist.append(dir_path)                                #如果是的话，那么filelist.append()直接添加元素到返回列表
            elif os.path.isdir(dir_path):                                #如果不是，判断是不是一个目录名字
                for s in os.listdir(dir_path):                           #是一个目录名字，那么用一个变量s来遍历这个目录下面的所有文件，读取文件的名字
                    if s == '__init__.py':                          #跳过名字为‘__init__.py’的文件
                        continue
                    else:
                        filelist.append(s)
#                         newDir = os.path.join(dir_path, s)               #将文件的名字和目录的名字进行拼接，合成完整带路径的文件名字，并且存入变量newDir
#                         self.getFileList(newDir, filelist)          #将这个文件名字添加的filelist列表中
        return filelist

    
    def get_pyList(self, read_dir_abs):
        """封装一个方法，用来读取指定目录下面的‘.py’文件，返回一个list.
        Args: 无
        Returns:
        Raises:
        author： roc
        createTime：2018-4-18
        example：list_py = get_pyList(dir)
        """
        list_py = []
        py_source = read_dir_abs
        lists = self.getFileList(py_source, [])
        for e in lists:
            searchObj = re.search(r'(.*)\.py', e)
    #       searchObj = re.search(r'(.*)\\test_.*\.py', e, re.M | re.I)
            if searchObj:
                list_py.append(searchObj.group())
            
        return list_py
    
    def set_run_result(self,rid,case_name,reason=''):
        '''默认情况下所有case运行都是pass，如果reason长度大于0，表示有失败信息，此时这是该case运行failed
            id, case在round表中的id值
            reason, 失败原因
        '''
        mydb=MysqlHelper('ev1','rm')
        dt=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
        if len(reason)>0:
            reason=reason.replace('\\','\\\\')
            sql="update runinfo set status=2,result='failed',failReason='"+reason+"',etime='"+dt+"' where caseName='"+case_name+"' and rid='"+str(rid)+"' "
            mydb.exc(sql)
        else:
            sql="update runinfo set status=2,result='passed',etime='"+dt+"' where caseName='"+case_name+"' and rid='"+str(rid)+"' " 
            mydb.exc(sql)
            
    def get_pub_msg(self):
        r = redis.StrictRedis(host = "10.7.3.17", port = 6379)
        p = r.pubsub()
        cli=self.get_cli_ip()
        p.subscribe(cli,"all")
        print("Start listening channal:"+cli+",all")
        for item in p.listen():
            if item['type']=='message':
                return item
            
    def get_task_case_name(self,queue_name,timeout=10):
        r = redis.StrictRedis(host = "10.7.3.17", port = 6379)
        t=r.blpop(queue_name, timeout)
        return t
    
    def get_last_case(self,queue_name):
        '''获取最后一个队列元素的名称
        '''
        r = redis.StrictRedis(host = "10.7.3.17", port = 6379)
        case=r.lindex(queue_name, -1)     
        return case
            
    def get_roundid_by_name(self,r_name):
        mydb=MysqlHelper('ev1','rm')
        rid=mydb.sqlquery("select max(id) as id from round where name='"+r_name+"'  ")
        return rid
        
            
    def init_task_status(self,rid,case_name):
        mydb=MysqlHelper('ev1','rm')
        dt=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
        cli_ip=self.get_cli_ip()
        sql="update runinfo set status=1,stime='"+dt+"',cli='"+str(cli_ip)+"' where caseName='"+case_name+"' and rid='"+str(rid)+"'  "
        mydb.exc(sql)
    
    def get_cli_ip(self):
        try:
            s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            s.connect(('8.8.8.8', 80))
            ip = s.getsockname()[0]
        finally:
            s.close()
        return ip
    
#     def excute_remote_cli(self,cli_ip,username,password):
#         bat_file="start d:\test.bat"  #os.path.dirname(__file__)+"/run_main.bat"
#         try:
#             conn=wmi.WMI(computer=cli_ip, user=username,password=password)
#             
#             for sys in conn.Win32_OperatingSystem():
#                 print ("Version:%s" % sys.Caption.encode("UTF8"),"Vernum:%s" % sys.BuildNumber)  #系统信息
#                 print (sys.OSArchitecture.encode("UTF8") ) # 系统的位数
#                 print (sys.NumberOfProcesses)  # 系统的进程数
#             
#             cmd=r"cmd /c call %s"%bat_file
#             conn.Win32_Process.Create(CommandLine=bat_file)
#             print(cli_ip+" 已启动监听！")
#         except Exception as e:
#             print(cli_ip+" 启动监听失败！:"+str(e))
            
    def run_listen_remote(self,cli_ip,username,password):
        try:
            cli=winrm.Session(cli_ip,auth=(username,password))
            res=cli.run_cmd(r'd:\test.bat')
            response=res.std_out.decode()
            if len(response)>0:
                print(res.std_out.decode())
                print(cli_ip+" 已启动监听！")
            else:
                print(cli_ip+" 启动监听有误！: 无返回信息！")
        except Exception as e:
            print(cli_ip+" 启动监听失败！:"+str(e))

if __name__ == '__main__':
    pass